package com.example.mvvmdemo.utils;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;

public class SPUtils {

    public static final String PREFERENCE_NAME = "appName";

    /**
     * 获取name为PREFERENCE_NAME的SP对象
     * @param context 上下文
     * @return SP
     */
    private static SharedPreferences getSP(Context context) {
        return context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
    }

    /**
     * 保存数据的方法，我们需要拿到保存数据的具体类型，然后根据类型调用不同的保存方法
     * @param context 上下文
     * @param key     键
     * @param value   值
     * @return true: 写入成功<br>false: 写入失败
     */
    @SuppressLint("CommitPrefEdits")
    public static boolean put(Context context, String key, Object value)
    {
        if (value instanceof String) {
            return getSP(context).edit().putString(key, (String) value).commit();
        } else if (value instanceof Integer) {
            return getSP(context).edit().putInt(key, (Integer) value).commit();
        } else if (value instanceof Boolean) {
            return getSP(context).edit().putBoolean(key, (Boolean) value).commit();
        } else if (value instanceof Float) {
            return getSP(context).edit().putFloat(key, (Float) value).commit();
        } else if (value instanceof Long) {
            return getSP(context).edit().putLong(key, (Long) value).commit();
        }
        return getSP(context).edit().putString(key, value.toString()).commit();
    }

    /**
     * 得到保存数据的方法，我们根据默认值得到保存的数据的具体类型，然后调用相对于的方法获取值
     * @param context 上下文
     * @param key     键
     * @param defaultValue  默认值
     * @return
     */
    public static Object get(Context context, String key, Object defaultValue)
    {
        if (defaultValue instanceof String) {
            return getSP(context).getString(key, (String) defaultValue);
        } else if (defaultValue instanceof Integer) {
            return getSP(context).getInt(key, (Integer) defaultValue);
        } else if (defaultValue instanceof Boolean) {
            return getSP(context).getBoolean(key, (Boolean) defaultValue);
        } else if (defaultValue instanceof Float) {
            return getSP(context).getFloat(key, (Float) defaultValue);
        } else if (defaultValue instanceof Long) {
            return getSP(context).getLong(key, (Long) defaultValue);
        }
        return null;
    }

    /**
     * 移除某个key值已经对应的值
     * @param context 上下文
     * @param key     键
     */
    public static void remove(Context context, String key)
    {
        SharedPreferences.Editor editor = getSP(context).edit();
        editor.remove(key);
        editor.apply();
    }

    /**
     * 清除所有数据
     * @param context 上下文
     */
    public static void clear(Context context)
    {
        SharedPreferences.Editor editor = getSP(context).edit();
        editor.clear();
        editor.apply();
    }

    /**
     * 查询某个key是否已经存在
     * @param context 上下文
     * @param key     键
     * @return
     */
    public static boolean contains(Context context, String key)
    {
        return getSP(context).contains(key);
    }

    /**
     * 返回所有的键值对
     * @param context 上下文
     * @return
     */
    public static Map<String, ?> getAll(Context context)
    {
        return getSP(context).getAll();
    }

}